package com.stellar.pay.core.service;

import com.stellar.pay.core.entity.OrderQueryResultDTO;
import com.stellar.pay.core.entity.RefundResultDTO;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;

/**
 * @Author Jqcc
 * @Version 1.0
 * @Data 2025/4/5
 * @Description 微信支付公共服务, 提供支付回调、关闭订单、退款、查询订单、查询退款记录的的能力
 * 支付回调目前提供两种 验签 方式 ：
 * 1.handlePaymentNotifyByDIY - 手动解析,可以看到验签过程,即 微信支付公钥(pub_key.pem)的解密内容
 * 2.handlePaymentNotifyBySDK - 使用微信SDK的方式进行验签
 */
public interface IWxPayCommonService {

    /**
     * 支付回调 (使用自己的DIY解析)
     *
     * @param request  微信官方发来的 ”支付结果" 通知
     * @param response 将"验签结果”回复微信官方，否则微信官方会一直给你回调，规则如下:
     *                 微信支付会按照(15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h)的频次
     *                 重复发送回调通知，直至微信支付接收到商户应答成功，或达到最大发送次数(15次)
     * @link https://pay.weixin.qq.com/doc/v3/merchant/4012791861
     */
    public void handlePaymentNotifyByDIY(HttpServletRequest request, HttpServletResponse response);


    /**
     * 支付回调 (使用微信SDK解析)
     *
     * @param request  微信官方发来的 ”支付结果" 通知
     * @param response 响应给微信官方的验签结果
     */
    public void handlePaymentNotifyBySDK(HttpServletRequest request, HttpServletResponse response);


    /**
     * 关闭订单
     *
     * @param outTradeNo 商户订单号
     * @link https://pay.weixin.qq.com/doc/v3/merchant/4012791860
     * 用户预提交订单成功后, 如果用户未支付,商户可调用关单接口关闭订单 , 微信也会自动关闭订单
     * 该接口只能关闭 2小时 内创建的订单, 且订单未支付, 否则接口调用报错
     * 业务方需先校验订单状态,如果是已经关闭或者已经支付的订单
     */
    public void closeOrder(String outTradeNo);


    /**
     * 查询订单通过商户订单号
     *
     * @param outTradeNo 商户订单号
     * @return 交易记录
     * 业务方需先查询是否有该订单,否则会报错
     */
    public OrderQueryResultDTO getOrderByOutTradeNo(String outTradeNo);


    /**
     * 查询订单通过微信订单号
     *
     * @param transactionId 微信订单号
     * @return 交易记录
     * 业务方需先查询是否有该订单,否则会报错
     */
    public OrderQueryResultDTO getOrderByTransactionId(String transactionId);


    /**
     * 退款申请
     *
     * @param outTradeNo  商户订单号
     * @param totalFee    原订单交易金额 , 单位为元
     * @param reFee       退款金额 , 单位为元
     * @param outRefundNo 商户退款单号
     * @return 退款详情
     * @link https://pay.weixin.qq.com/doc/v3/merchant/4012791862
     */
    public RefundResultDTO refund(String outTradeNo, BigDecimal totalFee, BigDecimal reFee, String outRefundNo);


    /**
     * 通过商户退款单号查询退款记录
     *
     * @param outRefundNo 商户退款单号
     * @return 退款详情
     */
    public RefundResultDTO getRefundByOutRefundNo(String outRefundNo);

}
